package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.BeneficiarioService;
import co.gov.medellin.ssti.sub.model.service.ErrorService;
import co.gov.medellin.ssti.sub.model.service.GrupoFamiliarService;
import co.gov.medellin.ssti.sub.model.service.VflexService;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.paoyer.administration.util.AccessControl;

public class RegistrarGrupoFamiliarAction extends Action {
	@Autowired
	BeneficiarioService beneficiarioServiceImpl;
	@Autowired
	ErrorService errorServiceImpl;
	@Autowired
	GrupoFamiliarService grupoFamiliarServiceImpl;
	@Autowired
	VflexService vflexServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		AccessControl access = new AccessControl();
		access.validateAccess(mapping, request, response);
		HttpSession session = request.getSession();

		// Para la auditoria de registros
		UserVO user = (UserVO) session.getAttribute("userInfo");
		String terminalAddress = "WEB=" + request.getRemoteAddr();
		Calendar c = Calendar.getInstance();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

		Collection<BeneficiarioVO> cGrupoFamiliarSisben = null;
		Collection<BeneficiarioVO> cGrupoFamiliar = null;
		List<BeneficiarioVO> lListGrupoFamiliarSisben = new LinkedList<BeneficiarioVO>();
		List<BeneficiarioVO> lListGrupoFamiliar = new LinkedList<BeneficiarioVO>();
		List<BeneficiarioVO> lListBeneficiario = new LinkedList<BeneficiarioVO>();
		List<BeneficiarioVO> lListBeneNoInsert = new LinkedList<BeneficiarioVO>();
		List<BeneficiarioVO> lListBeneInsert = new LinkedList<BeneficiarioVO>();
		List<VflexVO> lListParentesco = new LinkedList<VflexVO>();
		List<BeneficiarioVO> lListBeneSelected = new LinkedList<BeneficiarioVO>();

		BeneficiarioVO objbeneVO = new BeneficiarioVO();
		BeneficiarioVO objbeneJefeVO = new BeneficiarioVO();

		String strMaxCode = null;
		String strReturn = request.getParameter("Back");
		String strCodeBeneSelected = (String) session
				.getAttribute("CodeBeneSelected");
		String strInsert[] = new String[2];
		strInsert[0] = "false";

		boolean bContinuar = true;
		// Long lnCodeMax = null;

		session.removeAttribute("msgerror");

		cGrupoFamiliarSisben = (Collection<BeneficiarioVO>) session
				.getAttribute("InsertGrupoFamiliar");
		if (cGrupoFamiliarSisben != null && cGrupoFamiliarSisben.size() != 0) {
			for (int i = 0; i < cGrupoFamiliarSisben.size(); i++) {
				int iError = 0;
				lListGrupoFamiliarSisben = (List<BeneficiarioVO>) cGrupoFamiliarSisben;
				objbeneVO = (BeneficiarioVO) lListGrupoFamiliarSisben.get(i);
				objbeneVO.setCode(null);
				try {
					lListBeneficiario = (List<BeneficiarioVO>) beneficiarioServiceImpl
							.findBeneficiarioByCriteria(objbeneVO, "gf");

					int iReturn = errorServiceImpl.insertError("Debug",
							"Se realizo la consulta correctamente. Nombre: "
									+ objbeneVO.getNombre1() + " linea 93");
				} catch (DAOException e) {
					SUBException.logDebugError("", e);
					iError = 1;
				}

				if (iError == 1) {
					try {
						int iReturn = errorServiceImpl.insertError("Debug",
								"Error al buscar el beneficiario. Nombre: "
										+ objbeneVO.getNombre1() + " Fecha: "
										+ objbeneVO.getFechaNacimiento()
										+ " linea 93");
					} catch (DAOException sqlex) {
						SUBException.logDebugError("", sqlex);
					}
				}

				if (lListBeneficiario.size() == 0) {
					objbeneVO.setCreationUser(user.getName());
					objbeneVO.setUpdateUser(user.getName());
					objbeneVO.setCreationTerminal("WEB=" + terminalAddress);
					objbeneVO.setUpdateTerminal("WEB=" + terminalAddress);
					objbeneVO.setUpdateDate(dateFormat.format(c.getTime()));
					objbeneVO.setCreationDate(dateFormat.format(c.getTime()));
					try {
						strInsert = beneficiarioServiceImpl.insert(objbeneVO);

						int iReturn = errorServiceImpl
								.insertError("Debug",
										"Se realizo la insercion correctamente. Nombre: "
												+ objbeneVO.getNombre1()
												+ " linea 116");
					} catch (DAOException se) {
						SUBException.logDebugError("", se);
						strInsert[0] = "false";
					}
					if (strInsert[0] == "false") {
						lListBeneNoInsert.add(objbeneVO);
					} else {
						objbeneVO.setCode(new Long(strInsert[1]));
						lListBeneInsert.add(objbeneVO);
					}

					if (objbeneVO.getParentesco().equals("JEFE")) {
						if (strInsert[0] == "false") {
							bContinuar = false;
							session.setAttribute(
									"msgerror",
									"No se puedo registrar la persona jefe de hogar: "
											+ objbeneVO.getNombre1() + " "
											+ objbeneVO.getNombre2() + " "
											+ objbeneVO.getPrimerApellido()
											+ " "
											+ objbeneVO.getSegundoApellido());
							break;
						} else {
							objbeneVO.setCode(new Long(strInsert[1]));
							objbeneJefeVO = objbeneVO;
						}
					}
				} else {
					try {
						int iReturn = errorServiceImpl.insertError("Debug",
								"El beneficiario ya existe. Nombre: "
										+ objbeneVO.getNombre1() + " linea 93");
					} catch (DAOException sqlex) {
						SUBException.logDebugError("", sqlex);
					}

					BeneficiarioVO objFindBeneVO = null;
					objFindBeneVO = (BeneficiarioVO) lListBeneficiario.get(0);
					objFindBeneVO.setParentesco(objbeneVO.getParentesco());
					lListBeneInsert.add(objFindBeneVO);

					if (objbeneVO.getParentesco().equals("JEFE")) {
						objbeneJefeVO = (BeneficiarioVO) lListBeneficiario
								.get(0);
					}
					if (((objFindBeneVO.getCode()).toString())
							.equals(strCodeBeneSelected)) {
						lListBeneSelected.add(objFindBeneVO);
					}
				}
			}
			// Fin del proceso

			if (bContinuar) {
				// Proceso para verificar si el grupo familiar esta registrado
				try {
					cGrupoFamiliar = beneficiarioServiceImpl
							.findCabezasGrupoFamiliar(objbeneJefeVO);
				} catch (DAOException sqle) {
					SUBException.logDebugError("", sqle);
				}

				if (cGrupoFamiliar == null || cGrupoFamiliar.size() == 0) {
					// Proceso para traer el codigo del parentesco
					try {
						lListParentesco = (List<VflexVO>) vflexServiceImpl
								.findCodeValorFlex(objbeneJefeVO
										.getParentesco());
					} catch (DAOException sqle) {
						SUBException.logDebugError("", sqle);
					}

					// Fin del Proceso
					VflexVO objValorflexVO = new VflexVO();
					objValorflexVO = (VflexVO) lListParentesco.get(0);
					String inserto[] = new String[2];
					inserto[0] = "false";
					try {
						inserto = grupoFamiliarServiceImpl
								.insert(objbeneJefeVO.getCode(),
										objbeneJefeVO.getNumeroDocumento(),
										objValorflexVO.getCode(),
										user.getName(), terminalAddress,
										dateFormat.format(c.getTime()));
					} catch (DAOException sqle) {
						SUBException.logDebugError("", sqle);
					}

					if (inserto[0] != "true") {
						bContinuar = false;
						session.setAttribute("msgerror",
								"No se puedo crear el grupo familiar para la persona: "
										+ objbeneVO.getNombre1() + " "
										+ objbeneVO.getNombre2() + " "
										+ objbeneVO.getPrimerApellido() + " "
										+ objbeneVO.getSegundoApellido());
					} else {
						try {
							strMaxCode = grupoFamiliarServiceImpl.findMaxCode()
									.toString();
						} catch (DAOException sqle) {
							SUBException.logDebugError("", sqle);
						}

						// obtener el maximo codigo de la tabla grupo familiar
					}
				} else {
					lListGrupoFamiliar = (List<BeneficiarioVO>) cGrupoFamiliar;
					BeneficiarioVO objGrupoVO = (BeneficiarioVO) lListGrupoFamiliar
							.get(0);
					strMaxCode = objGrupoVO.getGrupoFamiliarCode().toString();
					// obtener el codigo del grupo familiar.
				}
				// Fin del proceso
			}

			if (bContinuar) {
				if (lListBeneInsert.size() != 0) {

					for (int i = 0; i < lListBeneInsert.size(); i++) {

						BeneficiarioVO objBeneficiarioVO = new BeneficiarioVO();
						objBeneficiarioVO = (BeneficiarioVO) lListBeneInsert
								.get(i);
						// Proceso para identificar si el beneficiario ya esta
						// asignado al grupo familiar
						boolean bSearch = false;
						try {
							bSearch = beneficiarioServiceImpl
									.isBeneficiarioAsignadoAGrupoFamiliar(
											objBeneficiarioVO.getCode(),
											new Long(strMaxCode));
						} catch (DAOException sqle) {
							SUBException.logDebugError("", sqle);
						}
						// Fin del proceso

						if (!bSearch) {
							// Proceso para traer el codigo del parentesco
							try {
								lListParentesco = (List<VflexVO>) vflexServiceImpl
										.findCodeValorFlex(objBeneficiarioVO
												.getParentesco());
							} catch (DAOException sqle) {
								SUBException.logDebugError("", sqle);
							}

							// Fin del Proceso
							VflexVO objVflexVO = null;
							objVflexVO = new VflexVO();
							objVflexVO = (VflexVO) lListParentesco.get(0);

							try {
								boolean bInsertOk = grupoFamiliarServiceImpl
										.asignarBeneficiarioAGrupoFamiliar(
												objBeneficiarioVO.getCode(),
												new Long(strMaxCode),
												objVflexVO.getCode(),
												user.getName(),
												terminalAddress,
												dateFormat.format(c.getTime()));
							} catch (DAOException sqle) {
								SUBException.logDebugError("", sqle);
							}
						}

					}
				} else {
					session.setAttribute("msgasignar",
							"No hay beneficiarios para asignar al grupo familiar");
				}
			}
		}

		if (lListBeneSelected.size() != 0) {
			request.setAttribute("ListBeneSelected", lListBeneSelected);
		}
		if (lListBeneInsert.size() != 0) {
			request.setAttribute("ListBeneInsert", lListBeneInsert);
		}
		if (lListBeneNoInsert.size() != 0) {
			request.setAttribute("ListBeneNoInsert", lListBeneNoInsert);
		}
		if (strReturn != null) {
			request.setAttribute("Return", strReturn);
		}
		return mapping.findForward("success");
	}
}